package com.itany.nmms.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itany.nmms.constant.DictConstant;
import com.itany.nmms.constant.StatusConstant;
import com.itany.nmms.dao.ProductTypeMapper;
import com.itany.nmms.entity.ProductType;
import com.itany.nmms.entity.ProductTypeExample;
import com.itany.nmms.exception.ProductTypeExistException;
import com.itany.nmms.exception.RequestParameterErrorException;
import com.itany.nmms.factory.ObjectFactory;
import com.itany.nmms.service.ProductTypeService;
import com.itany.nmms.util.ParameterUtil;

import java.util.List;

/**
 * @author 石小俊
 * @date 2023年07月24日 13:32
 */
public class ProductTypeServiceImpl implements ProductTypeService {
    @Override
    public void addType(String name) throws RequestParameterErrorException, ProductTypeExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(name)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 商品类型名称不能重复
        // 根据商品类型名称进行查询
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name);
        List<ProductType> types = typeMapper.selectByExample(example);
        // 如果查询到数据了,则说明已经存在
        if(!types.isEmpty()){
            throw new ProductTypeExistException("该商品类型已经存在");
        }

        ProductType type = new ProductType();
        type.setName(name);
        // 状态默认设置为启用,便于测试
        type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        typeMapper.insertSelective(type);

    }

    @Override
    public PageInfo<ProductType> findPage(String pageNo, String pageSize) {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");

        // 设置分页数据的默认值
        if(ParameterUtil.isNull(pageNo)){
            pageNo = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_NO;
        }
        if(ParameterUtil.isNull(pageSize)){
            pageSize = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_SIZE;
        }

        // 开始分页,使用PageHelper分页插件进行分页
        // 1.导入依赖
            // pagehelper-4.1.6.jar
            // jsqlparser-1.0.jar
        // 2.在mybatis-config.xml中配置分页插件
        // 3.在Java代码中实现分页
        // 分页代码又分为三步
        // 第一步:设置分页信息
        // 参数一:第几页
        // 参数二:每页几条数据
        PageHelper.startPage(Integer.parseInt(pageNo),Integer.parseInt(pageSize));

        // 第二步:获取业务数据
        List<ProductType> types = typeMapper.selectByExample(new ProductTypeExample());

        // 第三步:封装分页对象
        PageInfo<ProductType> typePage = new PageInfo<>(types);

        return typePage;
    }

    @Override
    public ProductType findById(String id) throws RequestParameterErrorException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        return type;
    }

    @Override
    public void modifyName(String id, String name) throws RequestParameterErrorException, ProductTypeExistException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(id) || ParameterUtil.isNull(name)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 在修改的时候,其类型名称不能重复,但是可以是原来的名称
        // 只有满足以下条件才需要抛出异常
        // 1.该类型在数据库中已经存在,name相同
        // 2.该类型不是原有的类型名称,id不同
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name)
                .andIdNotEqualTo(Integer.parseInt(id));
        List<ProductType> types = typeMapper.selectByExample(example);
        if(!types.isEmpty()){
            throw new ProductTypeExistException("该商品类型已经存在");
        }

        ProductType type = new ProductType();
        type.setId(Integer.parseInt(id));
        type.setName(name);
        // 使用动态sql进行修改
        typeMapper.updateByPrimaryKeySelective(type);

    }

    @Override
    public void modifyStatus(String id) throws RequestParameterErrorException {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 根据主键查询当前商品类型详情
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        // 判断当前商品类型的状态
        // 如果状态为启用
        if(type.getStatus() == StatusConstant.PRODUCT_TYPE_STATUS_ENABLED){
            // 将其改为禁用
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_DISABLED);
        } else{
            // 否则改为启用
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        }

        // 执行修改操作
        typeMapper.updateByPrimaryKeySelective(type);
    }

    @Override
    public List<ProductType> findEnable() {
        ProductTypeMapper typeMapper = (ProductTypeMapper) ObjectFactory.getObject("typeMapper");
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andStatusEqualTo(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        List<ProductType> types = typeMapper.selectByExample(example);
        return types;
    }
}
